import java.awt.*;
import java.awt.geom.*;

/**
* Beispiel fuer verschiedene Arten, Linienenden und Verbindungen von Linien
* zu zeichnen
*
* @author Frank Klawonn
* Letzte Aenderung 10.05.2005
*/
public class LineEndings extends Frame
{


  /**
  * Konstruktor
  */
  LineEndings()
  {
    //Ermoeglicht das Schliessen des Fensters
    addWindowListener(new MyFinishWindow());
  }


  public void paint(Graphics g)
  {

    Graphics2D g2d = (Graphics2D) g;


    //Verwendung von Antialiasing, um die Raender weniger ausgefranst
    //erscheinen zu lassen
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

    //Es soll ein Linienzug von (startx,starty) nach (tipx,tipy) und weiter
    //nach (endx,endy) gezeichnet werden.
    int startx = 50;
    int starty = 100;

    int tipx = 150;
    int tipy = 250;

    int endx = 180;
    int endy = 100;

    //Der Linienzug wird als GeneralPath definiert.
    GeneralPath gp = new GeneralPath();
    gp.moveTo(startx,starty);
    gp.lineTo(tipx,tipy);
    gp.lineTo(endx,endy);

    //Um den Linienzug mit verschiedenen Enden und Verbindungen an der
    //Verbindungsstelle bei (tipx,tipy) zu zeichnen, wird ein
    //BasicStroke benoetigt.
    BasicStroke bs;

    //Der Linienzug soll mehrfach mit verschieden Varianten des
    //BasicStroke geteichnet werden. offset gibt an, wie weit
    //der Linienzug jeweils nach rechts verschoben werden soll.
    int offSet = 180;
    int accumulatedOffset = 0;

    //Die Transformation verschiebt den Linienzug jeweils (bzw. gleich
    //das gesamte Objekt g2d.
    AffineTransform translation = new AffineTransform();


    //Zuerst werden die beiden Linien des Linienzugs als einzelne
    //Geradensegmente gezeichnet, die beim Zeichnen mit keiner
    //Technik verbunden werden.
    bs = new BasicStroke(30.0f);
    g2d.setStroke(bs);
    g2d.drawLine(startx,starty,tipx,tipy);
    g2d.drawLine(tipx,tipy,endx,endy);


    //Zeichnen des Linienzugs mit der Default-Einstellung (ausser der
    //uebertriebenen Liniendicke).
    accumulatedOffset = accumulatedOffset + offSet;
    translation.setToTranslation(accumulatedOffset,0);
    g2d.setTransform(translation);

    bs = new BasicStroke(30.0f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
    g2d.setStroke(bs);
    g2d.draw(gp);


    //Zeichnen des Linienzugs mit runden Enden und abgeschnittenen Verbindungen
    accumulatedOffset = accumulatedOffset + offSet;
    translation.setToTranslation(accumulatedOffset,0);
    g2d.setTransform(translation);

    bs = new BasicStroke(30.0f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL);
    g2d.setStroke(bs);
    g2d.draw(gp);


    //Zeichnen des Linienzugs mit abgeschnittenen, aber verlangerten Enden
    //und runden Verbindungen
    accumulatedOffset = accumulatedOffset + offSet;
    translation.setToTranslation(accumulatedOffset,0);
    g2d.setTransform(translation);

    bs = new BasicStroke(30.0f,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_ROUND);
    g2d.setStroke(bs);
    g2d.draw(gp);

  }




  public static void main(String[] argv)
  {
    LineEndings f = new LineEndings();
    f.setTitle("Enden von Linien");
    f.setSize(800,350);
    f.setVisible(true);
  }


}


